import { Inter, Permanent_Marker } from "next/font/google"; import { GeistSans } from "geist/font/sans"; import { GeistMono } from "geist/font/mono"; import { cn } from "@/shared/lib/utils"; import { generateStructuredData, StructuredDataScript } from "@/shared/lib/structured-data"; import { getServerUrl } from "@/shared/lib/server-url"; import { SiteConfig } from "@/shared/config/site-config"; import { WorkoutSessionsSynchronizer } from "@/features/workout-session/ui/workout-sessions-synchronizer"; import { ThemeSynchronizer } from "@/features/theme/ui/ThemeSynchronizer"; import { Header } from "@/features/layout/Header"; import { Footer } from "@/features/layout/Footer"; import { Version } from "@/components/version"; import { TailwindIndicator } from "@/components/utils/TailwindIndicator"; import { NextTopLoader } from "@/components/ui/next-top-loader"; import { ServiceWorkerRegistration } from "@/components/pwa/ServiceWorkerRegistration"; import { Providers } from "./providers"; import type { ReactElement } from "react"; import type { Metadata } from "next"; import "@/shared/styles/globals.css"; export const metadata: Metadata = { title: { default: SiteConfig.title, template: `%s | ${SiteConfig.title}`, }, description: SiteConfig.description, keywords: SiteConfig.keywords, applicationName: SiteConfig.seo.applicationName, category: SiteConfig.seo.category, classification: SiteConfig.seo.classification, metadataBase: new URL(getServerUrl()), manifest: "/manifest.json", robots: { index: true, follow: true, googleBot: { index: true, follow: true, "max-snippet": -1, "max-image-preview": "large", "max-video-preview": -1, }, }, verification: { google: process.env.GOOGLE_SITE_VERIFICATION, }, openGraph: { title: SiteConfig.title, description: SiteConfig.description, url: getServerUrl(), siteName: SiteConfig.title, images: [ { url: `${getServerUrl()}/images/default-og-image_fr.jpg`, width: SiteConfig.seo.ogImage.width, height: SiteConfig.seo.ogImage.height, alt: `${SiteConfig.title} - Plateforme de fitness moderne`, }, { url: `${getServerUrl()}/images/default-og-image_en.jpg`, width: SiteConfig.seo.ogImage.width, height: SiteConfig.seo.ogImage.height, alt: `${SiteConfig.title} - Modern fitness platform`, }, ], locale: "fr_FR", type: "website", }, twitter: { card: "summary_large_image", site: SiteConfig.seo.twitterHandle, creator: SiteConfig.seo.twitterHandle, title: SiteConfig.title, description: SiteConfig.description, images: [ { url: `${getServerUrl()}/images/default-og-image_fr.jpg`, width: SiteConfig.seo.ogImage.width, height: SiteConfig.seo.ogImage.height, alt: `${SiteConfig.title} - Plateforme de fitness moderne`, }, ], }, alternates: { canonical: "https://www.workout.cool", languages: { "fr-FR": "https://www.workout.cool/fr", "en-US": "https://www.workout.cool/en", "x-default": "https://www.workout.cool", }, }, authors: [{ name: SiteConfig.company.name, url: getServerUrl() }], creator: SiteConfig.company.name, publisher: SiteConfig.company.name, formatDetection: { email: false, address: false, telephone: false, }, appleWebApp: { capable: true, statusBarStyle: "default", title: SiteConfig.title, }, icons: { icon: [ { url: "/images/favicon-32x32.png", sizes: "32x32", type: "image/png" }, { url: "/images/favicon-16x16.png", sizes: "16x16", type: "image/png" }, { url: "/images/favicon.ico", type: "image/x-icon" }, ], apple: [{ url: "/apple-touch-icon.png", sizes: "180x180", type: "image/png" }], shortcut: "/images/favicon.ico", }, other: { "msapplication-TileColor": "#FF5722", "msapplication-TileImage": "/android-chrome-192x192.png", }, }; const inter = Inter({ subsets: ["latin"], variable: "--font-inter", display: "swap", }); const permanentMarker = Permanent_Marker({ weight: "400", subsets: ["latin"], variable: "--font-permanent-marker", display: "swap", }); export const preferredRegion = ["fra1", "sfo1", "iad1"]; interface RootLayoutProps { params: Promise<{ locale: string }>; children: ReactElement; } export default async function RootLayout({ params, children }: RootLayoutProps) { const { locale } = await params; // Generate structured data const websiteStructuredData = generateStructuredData({ type: "WebSite", locale, }); const organizationStructuredData = generateStructuredData({ type: "Organization", locale, }); const webAppStructuredData = generateStructuredData({ type: "WebApplication", locale, }); return ( <>
{/* PWA Meta Tags */} {/* PWA Manifest */} {/* eslint-disable-next-line @next/next/no-page-custom-font */} {/* Alternate hreflang for i18n */} {/* Theme color for PWA */} {/* Structured Data */}